iT邦幫忙

2025 iThome 鐵人賽

DAY 1
0

前言

Disclaimer:筆者使用 Typst 製作投影片、簡易製圖只有一年多的經驗,還請大家多包涵與指教。

個人覺得以簡易型文件、或是繪製演算法示意圖來說,使用 Typst / CeTZ 比起 LaTeX 來說方便得多。當然以專業論文排版還是以 LaTeX 系列為正宗,對於各式各樣的排版要求也都支援得比較完整一些。但是,若以程式設計的角度來思考排版這件事情,那麼 Typst 略勝一籌。來一個亂七八糟的類比吧:若將 LaTeX 類比成 C/C++,那麼 Typst 大概就是 Python!(事實上 Typst 底層是 Rust~)

在接下來的 30 天裡面,筆者想要從一個已經「有程式基礎的演算法愛好者」的角度出發,向大家介紹 Typst 這套排版系統有意思的地方。

安裝

由於 Typst 的底層實作是 Rust,在設計之初也融入了非常多現代程式設計的巧思與觀念。各位可以直接從 Typst 官方的 github 連結 (https://github.com/typst/typst) 查看並安裝這套排版系統,並且搭配 VSCode 或相關具有即時瀏覽功能的 IDE 進行排版。它也有線上協作平台,但很顯然伺服器距離台灣遙遠,因此使用體驗非常糟糕,遠不及 Overleaf。直接安裝在本機使用效果好一萬倍以上。

難過QQ iT邦幫忙不支援 typst script 的 syntax highlight。

基本觀念:程式碼區塊、排版區塊

在 Typst 裡面,程式碼區塊以大括弧 {} 夾起來;排版區塊以 [] 夾起來。在排版區塊中,以特殊的跳脫字元 # 作為存取變數、呼叫函數或進入不同區塊使用。在一份 .typ 文件當中,最外層被預設為排版區塊;也就是說完全不需要撰寫任何的「程式碼」就已經可以進行排版了。在排版區塊中,可以使用類似 Markdown 的標記語言進行文章撰寫。

= 我的第一份 Typst 文件

若想要排版出有特色的 #text(fill: blue)[Hello World] 就會長得像這樣哦!

+ Typst 很棒。
+ Typst 超級棒。
+ Typst 實在是有夠棒。

編譯出來的 PDF 截圖長這樣:

https://ithelp.ithome.com.tw/upload/images/20250815/20112376MB0omoEUf1.png

今天的主題:數學式的排版

Typst 的一大特色就是擁有尚可的數學式排版能力。數學式子的顯示模式大略來說可以分成兩種:隨文數式 (inline style)展示數式 (display style)。其中隨文數式使用時以單一 "$" 符號匡起、展示數式時則是以 "\[, \]" 或是雙錢號 "$$" 作為進入數學展示模式的符號。在 Typst 中這點被大幅簡化了:我們僅需要在兩個 "$" 符號與實際的數學式子之間留下至少一個空白,就會被辨認為展示模式!

範例一:解一元二次方程

那我們就從大家最熟悉的一元二次方程開始解起吧!

https://ithelp.ithome.com.tw/upload/images/20250815/20112376mG3kdf9xLA.png

上面的公式可以從下面這個原始碼排版得出:

$ x = (-b plus.minus sqrt(b^2 - 4a c))/(2a) $

這邊就有與 LaTeX 不同之處了:Typst 會自動抓分子分母的兩端,然後進行排版。這有好有壞,若需要自己控制它的排版位置,可能就沒那麼方便。但絕大多數場合是方便的啦,就不需要自己寫 \frac{}{} 了!

來寫點程式吧!

Typst 厲害的地方就是可以寫簡易腳本程式!因此我們可以把上述解一元二次方程的兩根,變成一個自定義的函數。

#let compute-delta(a, b, c) = {b * b - 4 * a * c}
#let find-roots(a, b, c) = {
  let sq = calc.sqrt(compute-delta(a, b, c))
  return ((-b + sq)/(2*a), (-b - sq)/(2*a))
}

接著將 $a=1, b=-5, c=6$ 帶入即可得到兩根:

#rect(width:100%)[
  #find-roots(1, -5, 6)
]

注意到,find-roots 函式回傳的是一個大小為 2 的陣列。顯示其數值的時候,只需要使用 # 符號將回傳值直接排版成文字即可。

排版結果會變成這樣:
https://ithelp.ithome.com.tw/upload/images/20250815/20112376qK2gUaKRyW.png

範例二:解二元一次方程組

現在讓我們來挑戰看看二元一次方程組。如以下的式子:
https://ithelp.ithome.com.tw/upload/images/20250815/201123766vwzd3GwxC.png

#let eq1 = (x: 3, y: 2, constant: -4)
#let eq2 = (x: 5, y: -4, constant: -3)

對於一個式子我們可以將其係數們用一個字典 (dictionary) 來表示,例如當我們想要保存 $3x+2y-4=0$ 這個式子的時候,可以寫成 #eq1 這個樣子。同理,我們也可以把第二個等式定義成 #eq2 的樣子。

接下來就可以定義解二元一次方程組的函式囉。同理,我們也可以直接使用行列式的公式。

#let solve-equations(eq1, eq2) = {
  let delta = eq1.x * eq2.y - eq1.y * eq2.x
  let dx = - eq1.constant * eq2.y + eq1.y * eq2.constant
  let dy = - eq1.x * eq2.constant + eq1.constant * eq2.x
  return (x: dx / delta, y : dy / delta)
}

#rect(width:100%)[
  #solve-equations(eq1, eq2)
]

https://ithelp.ithome.com.tw/upload/images/20250815/201123768a38xdZUBc.png


下一篇
Day 2: Typst 的表格排版
系列文
Typst 與 CeTZ:對演算法與程式設計超友好的排版製圖工具19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言